/*
 * PriorityQueueScheduler.h
 *
 *  Created on: 2011-05-04
 *      Author: Piotrek
 */

#ifndef PRIORITYQUEUESCHEDULER_H_
#define PRIORITYQUEUESCHEDULER_H_

#include <map>
#include "AbstractScheduler.h"

/**
 * Komparator priorytetow pakietow.
 */
struct PriorityComparator
{
  bool operator()(int32_t p1, int32_t p2) const
  {
    return p1 > p2;
  }
};

/**
 * Klasa implementujaca scheduler z kolejka priorytetowa
 */
class PriorityQueueScheduler : public AbstractScheduler
{
protected:
	/**
	 * Maksymalna dlugosc kolejki po ktorej przekroczeniu nadchodzace pakiety
	 * beda odrzucane. Kazda kolejka ma taka sama dlugosc
	 */
	int32_t maxQueueSize;
	/**
	 * Odwzorowania priorytetow pakietow na kolejki pakietow.
	 */
	std::map<int32_t, cPacketQueue*, PriorityComparator> queues;

	/**
	 * Iniciuje parametr 'maxQueueSize'.
	 */
	virtual void initialize();
	/**
	 * Usuwa niepotrzebne juz obiekty.
	 */
	~PriorityQueueScheduler();

	virtual bool receivePacket(NetPacket* packet, int gateNum);

	virtual bool hasPacketsAwaitingDeparture();
	virtual NetPacket* getPacketForDeparture();

	/**
	 * Informuje czy scheduler jest jeszcze w stanie przyjmowac pakiety.
	 */
	bool canReceive(int32_t queueNum);
};

#endif /* PRIORITYQUEUESCHEDULER_H_ */
